//
// Created by yzpang on 2025/5/20.
//

#include "Polynomial.h"

/**
 * 创建
 *
 * 创建项数为m的一元多项式
 * @param P
 * @param m
 */
void CreatePolyn(Polynomial* P, int m) {
    ElemType e;
    Position h, q;
    Link s;
    int i;

    // 初始化一个线性链表存放一元多项式
    InitList(P);

    // 获取头指针
    h = GetHead(*P);

    // 填充头指针数据
    e.coef = 0.0f;
    e.expn = -1;
    SetCurElem(h, e);

    for (i = 1; i <= m ; i++) {
        e.coef = i * 3.0f + 2.0f;
        e.expn = i * 2 + 5;
        // 当前链表中不存在该指数项时,插入
        if (LocateElem(*P, e, &q, Cmp) == FALSE && q != NULL) {
            if (MakeNode(&s, e) == OK) {
                // 在q之后插入s
                InsertFirst(P, q, s);
            }
        }
    }
}

/**
 * 销毁
 *
 * 销毁一元多项式
 * @param P
 */
void DestroyPolyn(Polynomial* P) {
    DestroyList(P);
}

/**
 * 计数
 *
 * 返回一元多项式的项数.
 * @param P
 * @return
 */
int PolynLength(Polynomial P) {
    return ListLength(P);
}

/**
 * 加法
 *
 * 一元多项式相加 Pa = Pa + Pb
 * 计算完成后, 计算结果保存在Pa, Pb销毁
 * @param Pa
 * @param Pb
 */
void AddPolyn(Polynomial* Pa, Polynomial* Pb) {

}

/**
 * 减法
 *
 * 一元多项式相减 Pa = Pa - Pb
 * 计算完成后, 计算结果保存在Pa, Pb销毁
 * @param Pa
 * @param Pb
 */
void SubtractPolyn(Polynomial* Pa, Polynomial* Pb){

}

/**
 * 乘法
 *
 * 一元多项式相乘 Pa = Pa * Pb
 * 计算完成后, 计算结果保存在Pa, Pb销毁
 * @param Pa
 * @param Pb
 */
void MultiplyPolyn(Polynomial* Pa, Polynomial* Pb){

}

/**
 * 输出
 *
 * 打印输出一元多项式
 * @param P
 */
void PrintPolyn(Polynomial P) {
    int i;
    Link p;

    p = P.head->next;

    for (i = 1; i <= P.len ; i++) {
        if (p->data.coef == 0.0f) {
            continue;
        }

        if (i == 1) {
            printf("%g", p->data.coef);
        } else {
            if (p->data.coef > 0) {
                printf(" + %g", p->data.coef);
            } else {
                printf(" - %g", p->data.coef);
            }
        }

        if (p->data.expn != 0) {
            printf("x");

            if (p->data.expn != 1) {
                printf("^%d", p->data.expn);
            }
        }

        p = p->next;
    }

    printf("\n");
}

/**
 * 比较
 *
 * 比较c1和c2项指数大小
 * @param c1
 * @param c2
 * @return
 */
int Cmp(ElemType c1, ElemType c2) {
    int diff = c1.expn - c2.expn;

    if (diff > 0) {
        return 1;
    } else if (diff == 0) {
        return 0;
    } else {
        return -1;
    }
}